﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Diagnostics;
using System.IO;
using System.Xml.Serialization;

namespace BitBox.Framework.Util
{
    /// <summary>
    /// Prove funções para transformar Classes de Entidades (Models).
    /// </summary>
    /// <typeparam name="TEntity">Tipo da entidade</typeparam>
    [Serializable]
    public class Serializacao<TEntity>
    {
        /// <summary>
        /// Construtor privado, evita o new Serializacao();
        /// </summary>
        private Serializacao() { }    /// <summary>

        /// <summary>
        /// Converter uma entidade em uma string XML
        /// </summary>
        /// <param name="entity">Object da entidade.</param>
        /// <returns>Uma representação em XML da classe</returns>
        public static string ToXML(TEntity entity)
        {
            string output = string.Empty;

            using (StringWriter writer = new StringWriter())
            {
                XmlSerializer serializer = null;

                // Serialize the entity.
                serializer = new XmlSerializer(typeof(TEntity));
                serializer.Serialize(writer, entity);

                // Get serialized string.
                output = writer.ToString();
                writer.Close();
            }

            // Return the result.
            return output;
        }

        /// <summary>
        /// Converte um string XML em uma entidade customizada.
        /// </summary>
        /// <param name="xmlString">A string XML que representa a entidade.</param>
        /// <returns>O objeto da entidade.</returns>
        public static TEntity FromXML(string xmlString)
        {
            TEntity entity = default(TEntity);
            XmlSerializer serializer = null;

            using (StringReader reader = new StringReader(xmlString))
            {
                // Deserialize the entity.
                serializer = new XmlSerializer(typeof(TEntity));
                entity = (TEntity)serializer.Deserialize(reader);
            }

            return entity;
        }
    }
}
